package trastienda.bean;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.primefaces.model.UploadedFile;

import trastienda.dao.CategoriaDAO;
import trastienda.dao.ProductoDAO;
import trastienda.excepcion.DAOExcepcion;
import trastienda.modelo.Categoria;
import trastienda.modelo.Producto;

public class ProductosBean {
	private int idProducto;
	private int categoria;
	private String nombre;
	private String descripcion;
	private double precio; 
	private int stock;
	private int importancia; 
	private String imagen;
	private UploadedFile file;
	private String destination = "D:\\tmp\\";
	private ArrayList listaCategorias = new ArrayList();
	private static Collection<Producto> lista = null;
	private int flag = 0;
	private Producto selectedProd;
	
	public Producto getSelectedProd() {
		return selectedProd;
	}
	public void setSelectedProd(Producto selectedProd) {
		this.selectedProd = selectedProd;
	}
	
	
	public int getIdProducto() {
		return idProducto;
	}
	public void setIdProducto(int idProducto) {
		this.idProducto = idProducto;
	}
	public UploadedFile getFile() {
		return file;
	}
	public void setFile(UploadedFile file) {
		this.file = file;
	}	
	public int getCategoria() {
		return categoria;
	}
	public void setCategoria(int categoria) {
		this.categoria = categoria;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getDescripcion() {
		return descripcion;
	}
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
	public double getPrecio() {
		return precio;
	}
	public void setPrecio(double precio) {
		this.precio = precio;
	}
	public int getStock() {
		return stock;
	}
	public void setStock(int stock) {
		this.stock = stock;
	}
	public int getImportancia() {
		return importancia;
	}
	public void setImportancia(int importancia) {
		this.importancia = importancia;
	}
	public String getImagen() {
		return imagen;
	}
	public void setImagen(String imagen) {
		this.imagen = imagen;
	}
	
	public Collection<Producto> getLista(){
		
		ProductoDAO dao = new ProductoDAO();		
		try {
			
			if (lista == null) {
				System.out.println("Paso por aqui lista  " +flag);
				lista = dao.listar();
				
			}
			
		} catch (DAOExcepcion e) {			
			e.printStackTrace();
		}
		return lista;
	}
	
	public Collection<Producto> buscarProducto(){
		
		ProductoDAO dao = new ProductoDAO();		
		try {
			lista = dao.buscarProducto(nombre);
			System.out.println(nombre + " - "+lista.size());
			//nombre = new 
			
		} catch (DAOExcepcion e) {
			e.printStackTrace();
		}		
		return lista;
	}
	
	public String listar() {
		System.out.println("ProductoBean: listar()");
		ProductoDAO dao = new ProductoDAO();
//		CategoriaDAO dao = new CategoriaDAO();
		ExternalContext context = FacesContext.getCurrentInstance()
				.getExternalContext();
		HttpSession session = (HttpSession) context.getSession(true);
		try {
			session.setAttribute("PRODUCTOS_LISTADO", dao.listar());
		} catch (DAOExcepcion e) {
			System.err.println(e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage("Hubo un problema: " + e.getMessage()));
			return "error";
		}
		return "productoBean_listar";
	}
	
	public String eliminar() {
		ExternalContext context = FacesContext.getCurrentInstance()
				.getExternalContext();
		HttpServletRequest request = (HttpServletRequest) context.getRequest();
		System.out.println(request.getParameter("idProducto"));
		ProductoDAO dao = new ProductoDAO();
//		CategoriaDAO dao = new CategoriaDAO();
		try {
			dao.eliminar(Integer.parseInt(request.getParameter("idProducto")));///----
		} catch (DAOExcepcion e) {
			System.err.println(e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage("Hubo un problema: " + e.getMessage()));
			return "error";
		}
		return listar();
	}
	
	public String editar() {
		ExternalContext context = FacesContext.getCurrentInstance()
				.getExternalContext();
		HttpServletRequest request = (HttpServletRequest) context.getRequest();
		ProductoDAO dao = new ProductoDAO();
//		CategoriaDAO dao = new CategoriaDAO();
		try {
			Producto pro = dao.obtenerProductoPorId(Integer.parseInt(request.getParameter("idProducto")));
			System.out.println("editarBean idPr "+Integer.parseInt(request.getParameter("idProducto") ));
			request.setAttribute("productosBean", pro);
		} catch (DAOExcepcion e) {
			System.err.println(e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage("Hubo un problema: " + e.getMessage()));
			return "error";
		}
		return "productoBean_editar";
	}
	
	public String nuevo() {
		return "productoBean_nuevo";
	}
	
	public ArrayList getListaCategorias() {
		listaCategorias = new ArrayList<Categoria>();
		CategoriaDAO dao = new CategoriaDAO();
		try {
			List<Categoria> lista = (List<Categoria>) dao.listar();
			for (int i = 0; i < lista.size(); i++) {
				Categoria cat = new Categoria();
				cat = (Categoria) lista.get(i);
				listaCategorias.add(new SelectItem(cat.getIdCategoria(), cat.getNombre()));
//				System.out.println(cat.getIdCategoria()+" "+cat.getNombre());
			}
		} catch (DAOExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return listaCategorias;
	}
	
	public String insertar() {
		System.out.println("insertar producto");
		System.out.println(categoria);
//		System.out.println(descripcion);
		Producto pro = new Producto();
		Categoria cat = new Categoria();
		cat.setIdCategoria(categoria);
		pro.setCategoria(cat);
		pro.setDescripcion(descripcion);
		pro.setNombre(nombre);
		pro.setPrecio(precio);
		pro.setStock(stock);
		pro.setImagen(file.getFileName());
		pro.setImportancia(importancia);
		
		ProductoDAO dao = new ProductoDAO();
		try {
			dao.insertar(pro);
			copyFile(file.getFileName(), file.getInputstream());
		} catch (DAOExcepcion e) {
			System.err.println(e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage("Hubo un problema: " + e.getMessage()));
			return "error";
		} 
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return listar();
	}
	
	public void copyFile(String fileName, InputStream in) {
		try {
			// write the inputStream to a FileOutputStream
			OutputStream out = new FileOutputStream(new File(destination
					+ fileName));
			int read = 0;
			byte[] bytes = new byte[1024];
			while ((read = in.read(bytes)) != -1) {
				out.write(bytes, 0, read);
			}
			in.close();
			out.flush();
			out.close();
			System.out.println("New file created!");
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}
		
	public String actualizar() {
		System.out.println("actualizarBean");
		Producto pro = new Producto();
//		Categoria cat = new Categoria();
//		cat.setIdCategoria(1);
//		pro.setCategoria(cat);
		pro.setIdProducto(idProducto);
		pro.setDescripcion(descripcion);
		pro.setNombre(nombre);
		pro.setPrecio(precio);
		pro.setStock(stock);
//		pro.setImagen(imagen);
		pro.setImportancia(importancia);
		
		ProductoDAO dao = new ProductoDAO();
//		Categoria cat = new Categoria();
//		cat.setNombre(categoriaNombre);
//		cat.setDescripcion(descripcion);
//
//		CategoriaDAO dao = new CategoriaDAO();
		try {
			dao.actualizar2(pro);
		} catch (DAOExcepcion e) {
			System.err.println(e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage("Hubo un problema: " + e.getMessage()));
			return "error";
		}
		return listar();
	}
	
	public String listacat(String categoria) {
		System.out.println("listacat(categoria)");
		System.out.println(categoria);
		ProductoDAO dao = new ProductoDAO();		
		try {
			lista = dao.listacat(categoria);			
			System.out.println(lista.size());
		} catch (DAOExcepcion e) {
			System.err.println(e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage("Hubo un problema: " + e.getMessage()));
			return "error";
		}
		return "lista_cat";
	}

}
